#ifndef __BSP_DS1302_H
#define __BSP_DS1302_H
#include "bsp_port.h"
#include "stm32g0xx_ll_gpio.h"

#define BCD_TO_DEC(X) ((X >> 4) * 10 + (X & 0X0F))
#define DEC_TO_BCD(X) (((X / 10) << 4) | (X % 10))

#define CHARGE_INTERNAL

// GPIO: RST、CLK、DAT
#define RTC_RST_PIN LL_GPIO_PIN_6
#define RTC_RST_PORT GPIOC
#define RTC_CLK_PIN LL_GPIO_PIN_8
#define RTC_CLK_PORT GPIOA
#define RTC_DAT_PIN LL_GPIO_PIN_9
#define RTC_DAT_PORT GPIOA

#define GPIO_ReadInputDataBit LL_GPIO_IsInputPinSet

#define CE_L LL_GPIO_ResetOutputPin(RTC_RST_PORT, RTC_RST_PIN)   // 拉低使能位
#define CE_H LL_GPIO_SetOutputPin(RTC_RST_PORT, RTC_RST_PIN)     // 拉高使能位
#define SCLK_L LL_GPIO_ResetOutputPin(RTC_CLK_PORT, RTC_CLK_PIN) // 拉低时钟线
#define SCLK_H LL_GPIO_SetOutputPin(RTC_CLK_PORT, RTC_CLK_PIN)   // 拉高时钟线
#define DATA_L LL_GPIO_ResetOutputPin(RTC_DAT_PORT, RTC_DAT_PIN) // 拉低数据线
#define DATA_H LL_GPIO_SetOutputPin(RTC_DAT_PORT, RTC_DAT_PIN)   // 拉高数据线

typedef enum
{
    YEAR = 0, // 年
    MONTH,    // 月
    DAY,      // 日
    HOUR,     // 时
    MINUTE,   // 分
    SECOND,   // 秒
    WEEK      // 星期
} TIMEDATA_E;

typedef enum
{
    d_INPUT,  // 输入
    d_OUTPUT, // 输出
} Ds_GPIO_t;

struct TIMEData
{
    uint8_t year;   // 年
    uint8_t month;  // 月
    uint8_t day;    // 日
    uint8_t hour;   // 时
    uint8_t minute; // 分
    uint8_t second; // 秒
    uint8_t week;   // 星期
};

// 创建TIMEData结构体方便存储时间日期数据
extern struct TIMEData TimeData; // 全局变量

extern struct TIMEData TimeData_t;

void DS1302_GPIO_Init(void);               // ds1302端口初始化
uint8_t DS1302_Read_Reg(uint8_t _address); // 从指定寄存器读一字节数据
void DS1302_Init(void);                    // ds1302初始化函数
void DS1302_Read_Time(void);
void DS1302_Set_Time(TIMEDATA_E _timedata_e, uint8_t _value);
void bsp_DS1302_Debug(void);

#endif
